package ar.edu.caece.compiler.grammar.terminals;

import ar.edu.caece.compiler.model.Token;
import ar.edu.caece.compiler.grammar.GrammarSymbol;
import ar.edu.caece.compiler.grammar.TokenVisitorInterface;

public class FuncToken extends GrammarTerminal {

	public FuncToken(Token token) {
		super(token);
	}

	public static interface FuncTokenVisitor extends TokenVisitorInterface {
		public GrammarSymbol funcCase(FuncToken llamador) throws Exception;
	}
	
	public static abstract class FuncChainVisitor implements FuncTokenVisitor {
		private TokenVisitorInterface siguiente;
		protected FuncChainVisitor(TokenVisitorInterface siguienteVisitor) {
			siguiente = siguienteVisitor;
		}
		
		public GrammarSymbol defaultCase(GrammarTerminal llamador) throws Exception {
			return llamador.execute(siguiente);
		}
	}

	@Override
	public GrammarSymbol execute(TokenVisitorInterface visitor) throws Exception {
		return (visitor instanceof FuncTokenVisitor)? ((FuncTokenVisitor) visitor).funcCase(this):
			visitor.defaultCase(this);
		
	}
}
